Datos auxiliares
Para realizar conversiones a dolares de poder adquisitivo constante cargamos los datos del tipo de cambio de paridad (actualizado hasta 2018) y el índice de precios al consumidor de Estados Unidos.
#TC
tcp_arg <- as.data.table(read_excel("../resultados/argentina/renta_de_la_tierra_hidrocarburifera_arg.xlsx", sheet = "tipo_cambio"))
tcp_arg = tcp_arg[,!c("sv", "fuente"), with = F]
ipc_us <- as.data.table(read_csv("../data/bls/cpi.csv"))
Rows: 896 Columns: 5
-- Column specification --------------------------------------------------------------------------
Delimiter: ","
chr (3): Series ID, Period, Label
dbl (2): Year, Value
i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
setnames(ipc_us,"Year", "anio" )
ipc_us = ipc_us[, .(ipc_us_20 = mean(Value, na.rm=T)), by = anio]
ipc_us[, ipc_us_20 := generar_indice(serie = ipc_us_20,
fecha = anio, fecha_base = 2020)]
tail(tcp_arg)
Empleo, Remuneraciones y Masa Salarial
Valor total de la producción
Criterios metodológicos
Se presentan a continuación distintas estimaciones sobre la magnitud de riqueza presente en el sector hidrocarburífero: Valor Bruto y Agregado de Producción (VBP y VA), Consumo Interemedio (CI), Masa Salarial (MS) y Excedente Bruto de Explotación (EBE). El VBP surge de la valuación de la producción a sus precios correspondientes. El VA resulta de la diferencia entre el VBP y CI, el cual puede surgir originalmente de esta resta o a partir del coeficiente técnico de la Matriz Insumo Producto (MIP). El EBE constituye la plusvalía (PV) total de la rama, es decir, la suma de la renta de la tierra (RT) más la ganancia normal (Gnorm), y se obtiene luego de descontar la MS y los impuestos específicos (Imp) del VA. En todos los casos que se presentarán a continuación, los Imp se calcularon a partir de aplicar sobre el VBP un coeficiente resultante del peso de los impuestos promedio de la MIP de 1997. Lo mismo pasa con la estimación de la depreciación de capital o consumo de capital fijo (ConsKfijo), que se obtiene a partir de aplicar la tasa de depreciación promedio resultante de los balances de YPF (1998 - 2018) sobre el total de Propiedad, Planta y Equipo (PPyE) de la rama. Esta partida se aplica para obtener el Excedente Neto de Explotación. Se presentan distintas estimaciones para el VBP, CI y MS, que luego se observarán en la formulación matemática:
CCNN (ccnn_oficial)
- Valores contables oficiales de las Cuentas Nacionales (sólo disponible para el período 2004-2012). Dado que se presentan series de VBP y VA, se pudo estimar el CI como la diferencia de dichas cuentas. Se procedió a separar el VBP a partir del peso del VBP de los servicios de apoyo a la extracción sobre el VBP de extracción de petróleo y gas, presente en el Cuadro de Utilización de Oferta (COU) de 2004 de INDEC. Se descontó esta proporción (resultante del 10,7%) del VBP total para obtener un VBP sólo de extracción. Dado que se posee información del salario promedio del sector y el empleo, se pudo obtener la MS resultante, tanto para el total del sector (extracción y servicios relacionados) como para sólo extracción. A partir de estos datos se elaboró un coeficiente que refleja el promedio de la proporción de la MS sobre el VBP que se utilizará en cálculos posteriores de MS total y MS de extracción.
Estimación propia con criterio CCNN (vbp_va_ci_propia)
- Estimación propia de los valores contables a partir de las fuentes recopiladas, siguiendo los criterios de las Cuentas Nacionales. Es decir, para obtener el VBP se valua la producción destinada al mercado interno (resultante a partir de la diferencia entre producción y exportaciones) con los precios internos y las exportaciones con los precios de exportación, valuados tipo de cambio comercial (TCC). Se procedió también a separar el VBP de extracción neto de los servicios tal como se explicó anteriormente. El CI se estimó a partir de aplicar el coeficiente técnico (ratio CI/VBP) resultante de la MIP de 1997 (equivalente a 0.272). De igual manera, para calcular la masa salarial se aplicó el coeficiente de MS mencionado anteriormente. Finalmente, como se mencionó anteriormente, el VA el EBE se calcularon a partir de las diferencias mencionadas anteriormente.
Empalme CCNN (vbp_ccnn)
- Estimación que toma los valores oficiales de las cuentas nacionales para el período donde se presentan datos (2004 -2012) y que imputa los valores faltantes por medio de la evolución del índice del VBP propio con criterio CCNN explicado anteriormente. Asimismo, se utilizaron los valores oficiales de la MS cuando se encontraba disponible el dato (1996-2018), mientras que se utilizó el valor propio estimado con criterio de las CCNN para los restantes años.
Criterio Propio (pv_hidrocarburos_propia)
- Estimación propia que refleja con mayor precisión el valor de la riqueza total presente en el sector. El VBP se obtiene a paritr de valuar la totalidad de la producción a los precios externos o de referencia internacional y con el tipo de cambio de paridad (TCP), que mide la capacidad real de compra de la moneda nacional. Sin embargo, como el CI constituye intercambios de mercancías realizadas en el ámbito nacional, dicha partida se obtiene a partir de los valores obtenidos en la serie de empalme CCNN. De igual manera, se utilizó la MS resultante de esta última estimación.
Formulación matemática de estimaciones
Valor Bruto de Producción total, estimación con criterio propio \[VBP_{propia} = (Pext_{petróleo} * Q_{petróleo} + Pext_{gas} * Q_{gas}) * TCP\]
Donde:
- \(VBP_{propia}\) = Valor Bruto de la Producción total, estimación propia
- \(Pext_{petróleo}\) = Precio de exportación o referencia internacional del petróleo crudo (según corresponda)
- \(Pext_{gas}\) = Precio de exportación o referencia internacional del gas natural (según corresponda)
- \(Q_{petróleo}\) = Cantidades producidas totales de petróleo crudo
- \(Q_{gas}\) = Cantidades producidas totales de gas natural
- \(TCP\) = Tipo de Cambio de Paridad
Valor Bruto de Producción total, estimación con criterio CCNN \[VBP_{CCNN} = (Pint_{petróleo} * QMInt_{petróleo} + Pext_{petróleo} * Expo_{petróleo} + Pint_{gas} * QMInt_{gas} + Pext_{gas} * Expo_{gas})* TCC\]
Donde:
- \(VBP_{CCNN}\) = Valor Bruto de la Producción total, estimación propia con criterio de las CCNN
- \(Pint_{petróleo}\) = Precio mercado interno del petróleo crudo
- \(Pint_{gas}\) = Precio mercado interno del gas natural
- \(QMInt_{petróleo}\) = cantidades vendidas al mercado interno de petróleo crudo
- \(QMInt_{gas}\) = cantidades vendidas al mercado interno del gas natural
- \(Expo_{petróleo}\) = exportaciones de petróleo crudo
- \(Expo_{gas}\) = exportaciones de gas natural
- \(TCC\) = Tipo de Cambio Comercial
Valor Bruto de Producción extracción, estimación con criterio CCNN
\[VBP\_extr_{CCNN} = VBP_{CCNN} * (1-prop\_servicios)\]
Donde:
- \(VBP\_extr_{CCNN}\) = Valor Bruto de la Producción extracción, estimación propia con criterio de las CCNN
- \(prop\_extr\) = proporción del VBP de servicios de apoyo sobre VBP de extracción de petróleo y gas
Proporción de los servicios de apoyo sobre la extracción de petróleo y gas
\[prop\_servicios = \frac{VBP\_servicios_{COU}}{VBP\_extr_{COU} + VBP\_servicios_{COU}}\]
Donde:
- \(VBP\_servicios_{COU}\) = VBP de servicios de apoyo del Cuadro de Utilización de Oferta
- \(VBP\_extracción_{COU}\) = VBP de extracción de petróleo y gas del Cuadro de Utilización de Oferta
Consumo Intermedio, valores oficiales de las CCNN \[ CI_{CCNN} = VBP_{CCNN} - VA_{CCNN} \]
Donde:
- \(CI_{CCNN}\) = Consumo Intermedio total, estimación propia
- \(VA_{CCNN}\) = Valor Agregado, estimación de las CCNN
Consumo Intermedio, estimación con criterio CCNN \[ CI_{CCNN} = VBP_{CCNN} * Coef\_tec \] Donde:
- \(Coef\_tec\) = Coeficiente técnico de Matriz Insumo Producto
Consumo Intermedio de extracción, estimación con criterio CCNN
\[ CI\_extr_{CCNN} = VBP\_extr_{CCNN} * Coef\_tec \]
Donde:
- $ CI_extr_{CCNN}$ = Consumo Intermedio de extracción, estimación criterio CCNN
Masa Salarial, valores oficiales de las CCNN \[MS = W * Emp * 13\] Donde:
- \(MS\) = Masa Salarial
- \(W\) = Salario anual promedio
- \(Emp\) = Empleo
Masa Salarial, estimación con criterio CCNN \[MS = VBP_{CCNN} * Coef\_MS\]
Donde:
- \(Coef\_MS\) = Coeficiente de la proporción de MS sobre VBP
Masa Salarial de extracción, estimación con criterio CCNN \[MS\_extr = VBP\_extr_{CCNN} * Coef\_MS\]
Donde:
- \(MS\_extr\) = Masa salarial del sector extracción
Valor agregado, estimación criterio CCNN \[VA_{CCNN} = VBP_{CCNN} – CI_{CCNN} \] Donde:
- \(VA_{CCNN}\) = Valor Agregado, estimación propia con criterio CCNN
Valor agregado de extracción, estimación con criterio CCNN \[VA\_extr_{CCNN} = VBP\_extr_{CCNN} – CI\_extr_{CCNN} \]
Donde:
- \(VA\_extr_{CCNN}\) = Valor Agregado de extracción, estimación propia con criterio CCNN
Valor agregado, estimación con criterio propio \[VA_{propia} = VBP_{propia} – CI\_extr_{CCNN} \]
Donde:
- \(VA_{propia}\) = Valor Agregado, estimación con criterio propio
Excedente Bruto de Explotación, estimación con criterio CCNN \[EBE_{CCNN} = VA_{CCNN} – MS \]
Excedente Bruto de Explotación de extracción, estimación con criterio CCNN \[EBE\_extr_{CCNN} = VA\_extr_{CCNN} – MS\_extr \]
Excedente Bruto de Explotación, estimación con criterio propio \[EBE_{propia} = VA_{propia} – MS\_extr \]
Donde:
- \(EBE\) = Excedente Bruto de Explotación
- \(CI\_extr_{CCNN}\) = Consumo intermedio del sector extracción, estimación con criterio CCNN
Consumo de Capital Fijo, estimación con criterio propio \[ConKfijo = PPyE * prom(\frac{Dep}{PPyE}) \]
Donde:
- \(ConKfijo\) = Consumo de Capital Fijo
- \(PPyE\)= Propiedad, Planta y Equipo neta
- $prom() $ = tasa de depreciación promedio
- \(Dep\) = Depreciaciones (cuenta gastos por naturaleza)
Plusvalía (Excedente Neto de Explotación), estimación con criterio propio \[PV_{propia} = VA_{propia} - ConKfijo - Imp \]
Donde:
- \(PV_{propia}\) = Plusvalía (Excedente Neto de Explotación)
- \(Imp\) = Impuestos normales
Fuentes para la construcción de series de largo plazo
- Producción de Crudo:
- 1911 a 1992: Anuario de combustibles
- 1993 - actualidad: SESCO Downstream
- Exportaciones de Crudo:
- 1962 a 1993: UN Comtrade (clasificación SITC as reported)
- 1994 en adelante: SESCO Downstream
- Los datos faltantes de SESCO se completaron con MECON
- Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84
- Precio Mercado Interno de Crudo:
- 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
- 1989 a 1991: Anuario de YPF
- 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
- 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
- 1993 en adelante: MECON
- Precio Mercado Externo Crudo:
- entre 1962 y 1992: precio de exportación argentina de UN Comtrade
- entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
- entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
- 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
- Valores faltantes previos a 1992: Brent (Fuente: Inflation Data)
- Producción de Gas:
- 1911 a 1992: Anuario de combustibles
- 1993 en adelante: SESCO Downstream
- Exportaciones de gas:
- 1962 a 1996: UN Comtrade,
- 1997 en adelante: SESCO Downstream
- Datos faltantes para los años 1999 y 2000
- Precio Mercado Interno de gas:
- 1963 - 1969 & 1989 - 1992: Anuario de YPF
- 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
- 1993 en adelante: Secretaría de Energía - Base Regalías
- Precio Mercado Externo:
- Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
- 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
- Datos faltantes para los años previos a 1963 y período 1968-1971
- Valor Bruto de la Producción, Valor Agregado y Consumo Intermedio:
- INDEC - Dirección Nacional de Cuentas Nacionales (Base Minería e Hidrocarburos de las Cuentas Nacionales). Las variables “extraccion_y_servicios_hidrocarburos” refieren a “Extracción de petróleo crudo y gas natural. Actividades de servicios relacionadas con la extracción de petróleo y gas, excepto las actividades de prospección”
- Cálculo propio del VBP con datos datos de producción y precio internacional recopilados. Las fuentes son las siguientes (los criterios son los mismos para la utilización posterior en el cálculo de renta de la tierra hidrocarburífera por diferencial de precios, sobrevaluación cambiaria y otros mecanismos)
- Salario y empleo
- 1960-1996: estimación a partir de aplicación del coeficiente de proporción de la masa salarial sobre el VBP
- 1996 en adelante: Ministerio de Trabajo, Empleo y Seguridad Social - Observatorio de Empleo y Dinámica Empresarial (OEDE)
- Consumo de capital fijo
- Coeficiente de depreciación estimado a partir de Estados Contables de YPF (1998-2018)
······················· * Criterio de cómputo de la producción de gas: + 1911 a 1992: Anuario de combustibles + 1993 en adelante: SESCO Downstream
Criterio de cómputo para producicón de crudo:
1911 a 1992: Anuario de combustibles
1993 - actualidad: SESCO Downstream
Criterio para precio_crudo:
- 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
- 1989 a 1991: Anuario de YPF
- 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
- 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
- 1993 en adelante: MECON
Precio Mercado Interno de gas:
- 1963 - 1969 & 1989 - 1992: Anuario de YPF
- 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
- 1993 en adelante: Secretaría de Energía - Base Regalías
- Años faltantes: […]
Fuentes seleccionadas para el precio de referencia de crudo:
- entre 1962 y 1992: precio de exportación argentina de UN Comtrade (clasificación SITC as reported)
- entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
- entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
- 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
- Valores faltantes previos a 1992 (1970 - 1985): Brent (Fuente: Inflation Data)
Criterio de precio_externo_gas:
- Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
- 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
- Datos faltantes para los años previos a 1963 y período 1968-1971
Exportaciones de crudo:
- 1962 a 1993: UN Comtrade
- 1994 en adelante: SESCO Downstream
- Los datos faltantes de SESCO se completaron con MECON
- Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84
Fuentes seleccionadas:
1962 a 1996: UN Comtrade,
1997 en adelante: SESCO Downstream
Datos faltantes para los años 1999 y 2000
valor_total_produccion = read.csv("../resultados/data_viz/valor_total_produccion.csv")
graf_valor_produccion <- valor_total_produccion %>%
filter(anio > 1960) %>%
ggplot( aes(anio, valor, color = fuente))+
geom_line(alpha = 0.7)+
geom_point(size = 0.435, alpha = 0.2)+
theme_classic()+
theme(legend.position = "bottom")+
labs(title = "Valor de la Producción hidrocarburífera",
subtitle = "Valor total y componentes",
y = "Millones de pesos de 2018")+
facet_wrap(~variable)
gp <- ggplotly(graf_valor_produccion)#, width = 750, height = 700)
gp[['x']][['layout']][['annotations']][[2]][['x']] <- -0.11
gp %>% layout(margin = list(l = 75))
Renta de la tierra hidrocarburífera total. En precios constantes, sobre Plusvalía Total y PBI
Existen dos caminos para llegar al monto total de renta de la tierra hidrocarburífera: uno es descontando la ganancia normal de las empresas a la plusvalía total del sector y el otro es por medio de la suma de mecanismos de apropiación.
\[Renta\_hidrocarburífera = PV_{hidrocarburífera} - Gcia\_Normal_{hidrocarburífera}\]
Donde:
- \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia Normal del sector hidrocarburífero
- \(PV_{hidrocarburífera}\) = Plusvalía del sector hidrocarburífero
\[Gcia\_Normal_{hidrocarburífera} = KTA_{hidrocarburífero} * TG_{referencia}\]
Donde:
- \(KTA_{hidrocarburos}\) = Stock de capital adelantado del sector hidrocarburífero
- \(TG_{referencia}\) = Tasa de ganancia normal de referencia.
En este caso, seleccionamos la tasa de ganancia del sector industrial como parámetro para diferenciar la renta de la ganancia. A su vez, para el capital total adelantado de las empresas hidrocarburíferas, seleccionamos unicamente el valor resultante de la estimación de la PPyE de Bolsar, por lo que le faltan los inventarios y salarios adelantados.
El cálculo de renta total hidrocarburífera que se obtiene por medio de descontar la ganancia normal a la plusvalía total del sector, debe ser igual a la renta obtenida por medio de la agregación de los distintos mecanismos de apropiación. Es decir:
\[Renta\_hidrocarburífera = Renta\_diferencial\_precios + Renta\_sobrevaluación + Renta\_empresas + Impuestos\_netos\_específicos \] \[Impuestos\_netos\_específicos = Retenciones + Regalías - Subsidios\]
Renta de la tierra calculada a partir de descuentos sobre el valor bruto de producción (método directo)
graf_renta_directo_pbi <- renta_directo_pbi %>%
select(anio, renta_pv,renta_pbi ) %>%
# filter(anio >= 1962, fuente_gcia == "Propia") %>%
filter(anio >= 1962) %>%
gather(key = tipo_renta,
value = valor,
2:3) %>%
ggplot(aes(anio, valor))+
# geom_col(position = "dodge")+
geom_line()+
theme(legend.position = "bottom",
axis.text.x = element_text(angle = 45, vjust = 0.5, hjust=1))+
labs(title = "Renta hidrocarburífera total sobre PBI y Ganancias Totales",
subtitle = "A partir de estimación propia del VBP",
y = "%")+
scale_y_continuous(labels=scales::percent_format(accuracy = 2))+
facet_grid(~tipo_renta )
graf_renta_directo_pbi
# ggplotly(graf_renta_directo_pbi, height = 400, width = 600)
Renta de la tierra calculada a partir de suma de mecanismos de apropiación (método indirecto)
Impuestos y subsidios
Regalias
Retenciones
Subsidios
# ###### proporcion subsidios (viene del script preprocesamiento)
# renta_indirecto[,c("anio","proporcion_subsidios")] %>% arrange(-anio)
# renta_directo %>%
# mutate(peso_subsidios = subsidios/renta_total,
# metodo = "Directo") %>%
# select(anio, metodo, peso_subsidios, renta_total) %>%
# rbind(renta_indirecto %>%
# mutate(peso_subsidios = subsidios/renta_total,
# metodo = "Indirecto") %>%
# select(anio,metodo, peso_subsidios, renta_total)) %>%
# filter(anio > 2004) %>%
# reshape2::melt(id.vars = c("anio", "metodo")) %>%
# ggplot(aes(anio, value, color = metodo))+
# geom_line()+
# facet_wrap(~variable,scales= "free")
Suma de mecanismos
renta_mecanismos = as.data.table(read_excel("../resultados/argentina/renta_de_la_tierra_hidrocarburifera_arg.xlsx", sheet = "RTPG_mecanismos"))
renta_mecanismos = renta_mecanismos[,!c("Rtt", "IPC_18", "unidad"), with = F]
renta_mecanismos[, Subs := Subs *-1]
renta_mecanismos = melt(renta_mecanismos, id.vars = "anio",
variable.name = "tipo_renta",
value.name = "valor")
renta_mecanismos = Reduce(merge_func, list(renta_mecanismos, tcp_arg, ipc_us))
renta_mecanismos[, valor := ((valor/1e6)/TCp)/ipc_us_20]
renta_mecanismos[, unidad := "Millones de USD TCp de 2020"]
renta_plot3 = ggplot(renta_mecanismos, aes(anio, valor,
color = tipo_renta, fill = tipo_renta))+
geom_col(position = "stack")+
theme(legend.position = "bottom")+
labs(title = "Renta de la tierra hidrocarburífera",
subtitle = "Cursos de apropiación",
y = "Millones USD TCc de 2020")+
scale_x_continuous(breaks = seq(1960, 2020, 5))+
scale_y_continuous(breaks = seq(0, 50000, 10000),
labels=function(x) format(x, big.mark = ".", scientific = FALSE))+
theme_classic()
renta_plot3 = plot_theme(renta_plot3)+theme(legend.title = element_blank(),
axis.title.x = element_blank(),
axis.text.x = element_text(angle = 45,
vjust= 0.7, hjust= 0.5))
renta_plot3
ggsave("../resultados/argentina/renta_mecanismos_tcp.png",renta_plot3)
Comparación de estimaciones propias
renta_pextq = read_excel("../resultados/argentina/renta_de_la_tierra_hidrocarburifera_arg.xlsx", sheet = "RTPG_PextQ") %>%
select(anio ,unidad, valor = Rtt) %>%
mutate(var = "Renta por descuentos sobre plusvalía")
renta_mecanismos = read_excel("../resultados/argentina/renta_de_la_tierra_hidrocarburifera_arg.xlsx", sheet = "RTPG_mecanismos") %>%
select(anio ,unidad, valor = Rtt) %>%
mutate(var = "Renta por suma de mecanismos")
renta_arg = as.data.table(rbind(renta_pextq, renta_mecanismos))
merge_func <- function(...) merge(..., all.x = T, by = "anio")
renta_usd = Reduce(merge_func, list(renta_arg, tcp_arg, ipc_us))
renta_usd[, valor := ((valor/1e6)/TCp)/ipc_us_20]
renta_usd[, unidad := "Millones de USD TCp de 2020"]
# renta_usd = merge(renta_usd, tcp_arg, by = "anio", all.x= T)
renta_plot1 = ggplot(renta_usd[anio > 1995], aes(anio, valor, color = var))+
geom_line()+
labs(title = "Renta hidrocarburífera total de Argentina",
subtitle = "Comparación de estimaciones propias",
y = "Millones de USD TCp de 2020")+
# scale_y_continuous(breaks = seq(0, 60*1e4, 10*1e4))
scale_y_continuous(breaks = seq(0, 60000, 10000))
renta_plot1 = plot_theme(renta_plot1)+theme(legend.title = element_blank(),
axis.title.x = element_blank())
ggsave( filename = "../resultados/argentina/renta_mecanismos_y_pxq_ARG.png",
renta_plot1, width = 12, height = 10)
renta_plot1
renta_pextq_pbi = read_excel("../resultados/argentina/renta_de_la_tierra_hidrocarburifera_arg.xlsx", sheet = "RTPG_PextQ_vs_pib") %>%
mutate(var = "Renta por descuentos sobre plusvalía")
renta_mecanismos_pbi = read_excel("../resultados/argentina/renta_de_la_tierra_hidrocarburifera_arg.xlsx", sheet = "RTPG_mecanismos_vs_pib") %>%
mutate(var = "Renta por suma de mecanismos")
renta_pbi = as.data.table(rbind(renta_pextq_pbi, renta_mecanismos_pbi))
renta_pbi = renta_pbi[, !"unidad", with=F]
renta_pbi = melt(renta_pbi, id.vars = c("anio", "var"))
renta_plot2 = ggplot(renta_pbi, aes(anio, value, color = var))+
geom_line()+
facet_wrap(~variable, ncol =1)+
scale_y_continuous(labels = scales::percent_format(accuracy = 2))+
scale_x_continuous(breaks = seq(1960, 2020, 5))
renta_plot2 = plot_theme(renta_plot2)+theme(legend.title = element_blank(),
axis.title.x = element_blank(),
axis.text.x = element_text(angle = 45,
vjust= 0.7, hjust= 0.5),
axis.title.y = element_blank())
renta_plot2
Comparación con estimación de otros autores
#cargo renta autores
renta_autores <- fread("../resultados/argentina/renta_autores.csv")
renta_autores = merge(renta_autores, ipc_us, all.x=T, by = "anio")
renta_autores[, valor := valor /ipc_us_20]
renta_autores[, unidad := "Millones de USD TCc de 2020"]
renta_autores = renta_autores[,!"ipc_us_20", with=F]
renta_autores = merge(renta_autores, tcp_arg, all.x= T, by = "anio")
renta_autores[,valor := (valor*TCc)/TCp]
renta_autores= renta_autores[, !c("TCc", "TCp"), with = F]
#preproceso renta total
renta_usd = renta_usd[, !c("TCc", "TCp", "ipc_us_20"), with = F]
setnames(renta_usd, "var", "tipo_de_renta")
renta_usd[, autor := "Propia"]
#preproceso renta mecanismos
renta_mecanismos[, autor := "Propia"]
renta_mecanismos = renta_mecanismos[, !c("TCc", "TCp", "ipc_us_20"), with = F]
setnames(renta_mecanismos, "tipo_renta", "tipo_de_renta")
renta_mecanismos = dcast(renta_mecanismos, anio+autor+unidad~tipo_de_renta, value.var = "valor")
renta_mecanismos[, `:=`(renta_diferencial_precios = rowSums(cbind(Rdifp_crudo, Rdifp_gas), na.rm=T),
renta_estado_total = rowSums(cbind(Rret, Rreg), na.rm=T),
renta_sobrevaluacion = rowSums(cbind(Rsvx_crudo, Rsvx_gas), na.rm=T),
Subs = Subs*-1)]
renta_mecanismos= renta_mecanismos[, !c("Rdifp_crudo", "Rdifp_gas",
"Rsvx_crudo", "Rsvx_gas"), with=F]
setnames(renta_mecanismos, c("Rkindv", "Subs", "Rret", "Rreg"),
c("renta_empresas", "subsidios", "retenciones", "regalias") )
renta_mecanismos = melt(renta_mecanismos,id.vars = c("anio", "autor", "unidad"), variable.name = "tipo_de_renta",
value.name = "valor")
#junto los datos
renta_comparacion = rbind(renta_usd, renta_mecanismos, renta_autores)
#grafico renta total
graf_renta_total_comparacion = ggplot(data = renta_comparacion[str_detect(tipo_de_renta , "renta_total|Renta por suma de mecanismos") & anio > 1990],
aes(anio, valor, color = autor))+
geom_line()+
geom_point()+
theme(legend.position = "bottom")+
labs(title = "Renta de la tierra hidrocarburífera total de Argentina",
subtitle = "Comparación con otras estimaciones",
y = "Millones de USD TCp de 2020", x="",
caption = "Nota: en la estimación propia se utilizó la renta por por suma de mecanismos")+
theme_classic()+
scale_x_continuous(breaks = seq(1960, 2020, 5))+
scale_y_continuous(labels=function(x) format(x, big.mark = ".", scientific = FALSE))
graf_renta_total_comparacion =plot_theme( graf_renta_total_comparacion)+theme(
legend.title = element_blank())
graf_renta_total_comparacion
ggsave("../resultados/argentina/comparacion_autores_usd_tcp.png", graf_renta_total_comparacion,
width = 10, height = 5)
#grafico comparacion con otros autores
graf_tipos_renta <- ggplot(data = renta_comparacion[!str_detect(tipo_de_renta, c("renta_total|Renta por descuentos sobre plusvalía|Renta por suma de mecanismos|renta_estado_total"
# "renta_diferencial_precios",
))& anio >1990],
aes(anio, valor, color = autor))+
geom_line()+
geom_point(size = 0.5)+
geom_hline(yintercept = 0)+
facet_wrap(~tipo_de_renta, scales = "free_y")+
labs(title = "Renta de la tierra hidrocarburífera",
subtitle = "Comparación de estimaciones",
y = "Millones USD TCp de 2020")+
scale_x_continuous(breaks = seq(1990, 2020, 5))
# # # ggplotly(graf_tipos_renta, width = 800, height = 600)
graf_tipos_renta = plot_theme(graf_tipos_renta)+theme(
axis.text.x = element_text(angle = 45, hjust = 1),
strip.text = element_text(12), legend.title = element_blank() )
graf_tipos_renta
ggsave("../resultados/argentina/comparacion_autores_tipo_renta_usd_tcp.png",
graf_tipos_renta, width = 16, height = 10)
LS0tDQp0aXRsZTogIlZhbG9yIHRvdGFsIGRlIGxhIHByb2R1Y2Npw7NuOiBtYXNhIHNhbGFyaWFsLCBnYW5hbmNpYSB5IHJlbnRhIGRlIGxhIHRpZXJyYSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KI2xpbXBpZXphIGRlIG1lbW9yaWENCnJtKGxpc3QgPWxzKCkpDQpnYygpDQoNCiMgY29uZmlndXJhY2nDs24gZGUgaW1wcmVzacOzbg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KDQojIGJpYmxpb3RlY2FzDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkocmVhZHhsKQ0Kc291cmNlKCJmdW5jdGlvbnNfaGlkcm9jYXJidXJvcy5SIikNCg0KIyBwYXLDoW1ldHJvcyBwYXJhIGxvcyBncmFmaWNvcw0KYWxwaGFfbiA9IDAuNw0KYGBgDQoNCiMgRGF0b3MgYXV4aWxpYXJlcw0KUGFyYSByZWFsaXphciBjb252ZXJzaW9uZXMgYSBkb2xhcmVzIGRlIHBvZGVyIGFkcXVpc2l0aXZvIGNvbnN0YW50ZSBjYXJnYW1vcyBsb3MgZGF0b3MgZGVsIHRpcG8gZGUgY2FtYmlvIGRlIHBhcmlkYWQgKGFjdHVhbGl6YWRvIGhhc3RhIDIwMTgpIHkgZWwgw61uZGljZSBkZSBwcmVjaW9zIGFsIGNvbnN1bWlkb3IgZGUgRXN0YWRvcyBVbmlkb3MuIA0KYGBge3J9DQojVEMNCnRjcF9hcmcgPC0gYXMuZGF0YS50YWJsZShyZWFkX2V4Y2VsKCIuLi9yZXN1bHRhZG9zL2FyZ2VudGluYS9yZW50YV9kZV9sYV90aWVycmFfaGlkcm9jYXJidXJpZmVyYV9hcmcueGxzeCIsIHNoZWV0ID0gInRpcG9fY2FtYmlvIikpIA0KdGNwX2FyZyA9IHRjcF9hcmdbLCFjKCJzdiIsICJmdWVudGUiKSwgd2l0aCA9IEZdDQoNCmlwY191cyA8LSBhcy5kYXRhLnRhYmxlKHJlYWRfY3N2KCIuLi9kYXRhL2Jscy9jcGkuY3N2IikpIA0Kc2V0bmFtZXMoaXBjX3VzLCJZZWFyIiwgImFuaW8iICApDQppcGNfdXMgPSBpcGNfdXNbLCAuKGlwY191c18yMCA9IG1lYW4oVmFsdWUsIG5hLnJtPVQpKSwgYnkgPSBhbmlvXQ0KaXBjX3VzWywgaXBjX3VzXzIwIDo9IGdlbmVyYXJfaW5kaWNlKHNlcmllID0gaXBjX3VzXzIwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywgZmVjaGFfYmFzZSA9IDIwMjApXQ0KDQp0YWlsKHRjcF9hcmcpDQpgYGANCg0KIyBFbXBsZW8sIFJlbXVuZXJhY2lvbmVzIHkgTWFzYSBTYWxhcmlhbCANCg0KKiBTYWxhcmlvIHkgZW1wbGVvDQogICsgTVRFeVNTIChCYXNlIE1pbmVyw61hIGUgSGlkcm9jYXJidXJvcyBkZSBsYXMgQ3VlbnRhcyBOYWNpb25hbGVzKSAoMTk5Ni0yMDEzKQ0KICArIFtNaW5pc3RlcmlvIGRlIFRyYWJham8sIEVtcGxlbyB5IFNlZ3VyaWRhZCBTb2NpYWwgLSBPYnNlcnZhdG9yaW8gZGUgRW1wbGVvIHkgRGluw6FtaWNhIEVtcHJlc2FyaWFsIChPRURFKV0oaHR0cDovL3d3dy50cmFiYWpvLmdvYi5hci9lc3RhZGlzdGljYXMvb2VkZS9lc3RhZGlzdGljYXNuYWNpb25hbGVzLmFzcCkgKDE5OTYtMjAxOSkNCiAgKyBFUEggPz8NCjxicj4NCg0KDQpgYGB7cn0NCg0KYGBgDQoNCiMgVmFsb3IgdG90YWwgZGUgbGEgcHJvZHVjY2nDs24gIA0KDQoNCiMjIENyaXRlcmlvcyBtZXRvZG9sw7NnaWNvcyANClNlIHByZXNlbnRhbiBhIGNvbnRpbnVhY2nDs24gZGlzdGludGFzIGVzdGltYWNpb25lcyBzb2JyZSBsYSBtYWduaXR1ZCBkZSByaXF1ZXphIHByZXNlbnRlIGVuIGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybzogVmFsb3IgQnJ1dG8geSBBZ3JlZ2FkbyBkZSBQcm9kdWNjacOzbiAoVkJQIHkgVkEpLCBDb25zdW1vIEludGVyZW1lZGlvIChDSSksIE1hc2EgU2FsYXJpYWwgKE1TKSB5IEV4Y2VkZW50ZSBCcnV0byBkZSBFeHBsb3RhY2nDs24gKEVCRSkuIEVsIFZCUCBzdXJnZSBkZSBsYSB2YWx1YWNpw7NuIGRlIGxhIHByb2R1Y2Npw7NuIGEgc3VzIHByZWNpb3MgY29ycmVzcG9uZGllbnRlcy4gRWwgVkEgcmVzdWx0YSBkZSBsYSBkaWZlcmVuY2lhIGVudHJlIGVsIFZCUCB5IENJLCBlbCBjdWFsIHB1ZWRlIHN1cmdpciBvcmlnaW5hbG1lbnRlIGRlIGVzdGEgcmVzdGEgbyBhIHBhcnRpciBkZWwgY29lZmljaWVudGUgdMOpY25pY28gZGUgbGEgTWF0cml6IEluc3VtbyBQcm9kdWN0byAoTUlQKS4gRWwgRUJFIGNvbnN0aXR1eWUgbGEgcGx1c3ZhbMOtYSAoUFYpIHRvdGFsIGRlIGxhIHJhbWEsIGVzIGRlY2lyLCBsYSBzdW1hIGRlIGxhIHJlbnRhIGRlIGxhIHRpZXJyYSAoUlQpIG3DoXMgbGEgZ2FuYW5jaWEgbm9ybWFsIChHbm9ybSksIHkgc2Ugb2J0aWVuZSBsdWVnbyBkZSBkZXNjb250YXIgbGEgTVMgeSBsb3MgaW1wdWVzdG9zIGVzcGVjw61maWNvcyAoSW1wKSBkZWwgVkEuIEVuIHRvZG9zIGxvcyBjYXNvcyBxdWUgc2UgcHJlc2VudGFyw6FuIGEgY29udGludWFjacOzbiwgbG9zIEltcCBzZSBjYWxjdWxhcm9uIGEgcGFydGlyIGRlIGFwbGljYXIgc29icmUgZWwgVkJQIHVuIGNvZWZpY2llbnRlICByZXN1bHRhbnRlIGRlbCBwZXNvIGRlIGxvcyBpbXB1ZXN0b3MgcHJvbWVkaW8gZGUgbGEgIE1JUCBkZSAxOTk3LiBMbyBtaXNtbyBwYXNhIGNvbiBsYSBlc3RpbWFjacOzbiBkZSBsYSBkZXByZWNpYWNpw7NuIGRlIGNhcGl0YWwgbyBjb25zdW1vIGRlIGNhcGl0YWwgZmlqbyAoQ29uc0tmaWpvKSwgcXVlIHNlIG9idGllbmUgYSBwYXJ0aXIgZGUgYXBsaWNhciBsYSB0YXNhIGRlIGRlcHJlY2lhY2nDs24gcHJvbWVkaW8gcmVzdWx0YW50ZSBkZSBsb3MgYmFsYW5jZXMgZGUgWVBGICgxOTk4IC0gMjAxOCkgc29icmUgZWwgdG90YWwgZGUgUHJvcGllZGFkLCBQbGFudGEgeSBFcXVpcG8gKFBQeUUpIGRlIGxhIHJhbWEuIEVzdGEgcGFydGlkYSBzZSBhcGxpY2EgcGFyYSBvYnRlbmVyIGVsIEV4Y2VkZW50ZSBOZXRvIGRlIEV4cGxvdGFjacOzbi4gU2UgcHJlc2VudGFuIGRpc3RpbnRhcyBlc3RpbWFjaW9uZXMgcGFyYSBlbCBWQlAsIENJIHkgTVMsIHF1ZSBsdWVnbyBzZSBvYnNlcnZhcsOhbiBlbiBsYSBmb3JtdWxhY2nDs24gbWF0ZW3DoXRpY2E6DQoNCg0KDQojIyMgQ0NOTiAoKmNjbm5fb2ZpY2lhbCopDQogICsgVmFsb3JlcyBjb250YWJsZXMgb2ZpY2lhbGVzIGRlIGxhcyBDdWVudGFzIE5hY2lvbmFsZXMgKHPDs2xvIGRpc3BvbmlibGUgcGFyYSBlbCBwZXLDrW9kbyAyMDA0LTIwMTIpLiBEYWRvIHF1ZSBzZSBwcmVzZW50YW4gc2VyaWVzIGRlIFZCUCB5IFZBLCBzZSBwdWRvIGVzdGltYXIgZWwgQ0kgY29tbyBsYSBkaWZlcmVuY2lhIGRlIGRpY2hhcyBjdWVudGFzLiBTZSBwcm9jZWRpw7MgYSBzZXBhcmFyIGVsIFZCUCBhIHBhcnRpciBkZWwgcGVzbyBkZWwgVkJQIGRlIGxvcyBzZXJ2aWNpb3MgZGUgYXBveW8gYSBsYSBleHRyYWNjacOzbiBzb2JyZSBlbCBWQlAgZGUgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzLCBwcmVzZW50ZSBlbiBlbCBDdWFkcm8gZGUgVXRpbGl6YWNpw7NuIGRlIE9mZXJ0YSAoQ09VKSBkZSAyMDA0IGRlIElOREVDLiBTZSBkZXNjb250w7MgZXN0YSBwcm9wb3JjacOzbiAocmVzdWx0YW50ZSBkZWwgMTAsNyUpIGRlbCBWQlAgdG90YWwgcGFyYSBvYnRlbmVyIHVuIFZCUCBzw7NsbyBkZSBleHRyYWNjacOzbi4gRGFkbyBxdWUgc2UgcG9zZWUgaW5mb3JtYWNpw7NuIGRlbCBzYWxhcmlvIHByb21lZGlvIGRlbCBzZWN0b3IgeSBlbCBlbXBsZW8sIHNlIHB1ZG8gb2J0ZW5lciBsYSBNUyByZXN1bHRhbnRlLCB0YW50byBwYXJhIGVsIHRvdGFsIGRlbCBzZWN0b3IgKGV4dHJhY2Npw7NuIHkgc2VydmljaW9zIHJlbGFjaW9uYWRvcykgY29tbyBwYXJhIHPDs2xvIGV4dHJhY2Npw7NuLiBBIHBhcnRpciBkZSBlc3RvcyBkYXRvcyBzZSBlbGFib3LDsyB1biBjb2VmaWNpZW50ZSBxdWUgcmVmbGVqYSBlbCBwcm9tZWRpbyBkZSBsYSBwcm9wb3JjacOzbiBkZSBsYSBNUyBzb2JyZSBlbCBWQlAgcXVlIHNlIHV0aWxpemFyw6EgZW4gY8OhbGN1bG9zIHBvc3RlcmlvcmVzIGRlIE1TIHRvdGFsIHkgTVMgZGUgZXh0cmFjY2nDs24uIA0KDQojIyMgRXN0aW1hY2nDs24gcHJvcGlhIGNvbiBjcml0ZXJpbyBDQ05OICgqdmJwX3ZhX2NpX3Byb3BpYSopDQogICsgRXN0aW1hY2nDs24gcHJvcGlhIGRlIGxvcyB2YWxvcmVzIGNvbnRhYmxlcyBhIHBhcnRpciBkZSBsYXMgZnVlbnRlcyByZWNvcGlsYWRhcywgc2lndWllbmRvIGxvcyBjcml0ZXJpb3MgZGUgbGFzIEN1ZW50YXMgTmFjaW9uYWxlcy4gRXMgZGVjaXIsIHBhcmEgb2J0ZW5lciBlbCBWQlAgc2UgdmFsdWEgbGEgcHJvZHVjY2nDs24gZGVzdGluYWRhIGFsIG1lcmNhZG8gaW50ZXJubyAocmVzdWx0YW50ZSBhIHBhcnRpciBkZSBsYSBkaWZlcmVuY2lhIGVudHJlIHByb2R1Y2Npw7NuIHkgZXhwb3J0YWNpb25lcykgY29uIGxvcyBwcmVjaW9zIGludGVybm9zIHkgbGFzIGV4cG9ydGFjaW9uZXMgY29uIGxvcyBwcmVjaW9zIGRlIGV4cG9ydGFjacOzbiwgdmFsdWFkb3MgdGlwbyBkZSBjYW1iaW8gY29tZXJjaWFsIChUQ0MpLiBTZSBwcm9jZWRpw7MgdGFtYmnDqW4gYSBzZXBhcmFyIGVsIFZCUCBkZSBleHRyYWNjacOzbiBuZXRvIGRlIGxvcyBzZXJ2aWNpb3MgdGFsIGNvbW8gc2UgZXhwbGljw7MgYW50ZXJpb3JtZW50ZS4gRWwgQ0kgc2UgZXN0aW3DsyBhIHBhcnRpciBkZSBhcGxpY2FyIGVsIGNvZWZpY2llbnRlIHTDqWNuaWNvIChyYXRpbyBDSS9WQlApIHJlc3VsdGFudGUgZGUgbGEgTUlQIGRlIDE5OTcgKGVxdWl2YWxlbnRlIGEgMC4yNzIpLiBEZSBpZ3VhbCBtYW5lcmEsIHBhcmEgY2FsY3VsYXIgbGEgbWFzYSBzYWxhcmlhbCBzZSBhcGxpY8OzIGVsIGNvZWZpY2llbnRlIGRlIE1TIG1lbmNpb25hZG8gYW50ZXJpb3JtZW50ZS4gRmluYWxtZW50ZSwgY29tbyBzZSBtZW5jaW9uw7MgYW50ZXJpb3JtZW50ZSwgZWwgVkEgZWwgRUJFIHNlIGNhbGN1bGFyb24gYSBwYXJ0aXIgZGUgbGFzIGRpZmVyZW5jaWFzIG1lbmNpb25hZGFzIGFudGVyaW9ybWVudGUuIA0KDQojIyMgRW1wYWxtZSBDQ05OICgqdmJwX2Njbm4qKQ0KICArIEVzdGltYWNpw7NuIHF1ZSB0b21hIGxvcyB2YWxvcmVzIG9maWNpYWxlcyBkZSBsYXMgY3VlbnRhcyBuYWNpb25hbGVzIHBhcmEgZWwgcGVyw61vZG8gZG9uZGUgc2UgcHJlc2VudGFuIGRhdG9zICgyMDA0IC0yMDEyKSB5IHF1ZSBpbXB1dGEgbG9zIHZhbG9yZXMgZmFsdGFudGVzIHBvciBtZWRpbyBkZSBsYSBldm9sdWNpw7NuIGRlbCDDrW5kaWNlIGRlbCBWQlAgcHJvcGlvIGNvbiBjcml0ZXJpbyBDQ05OIGV4cGxpY2FkbyBhbnRlcmlvcm1lbnRlLiBBc2ltaXNtbywgc2UgdXRpbGl6YXJvbiBsb3MgdmFsb3JlcyBvZmljaWFsZXMgZGUgbGEgTVMgY3VhbmRvIHNlIGVuY29udHJhYmEgZGlzcG9uaWJsZSBlbCBkYXRvICgxOTk2LTIwMTgpLCBtaWVudHJhcyBxdWUgc2UgdXRpbGl6w7MgZWwgdmFsb3IgcHJvcGlvIGVzdGltYWRvIGNvbiBjcml0ZXJpbyBkZSBsYXMgQ0NOTiBwYXJhIGxvcyByZXN0YW50ZXMgYcOxb3MuIA0KICANCiMjIyBDcml0ZXJpbyBQcm9waW8gKCpwdl9oaWRyb2NhcmJ1cm9zX3Byb3BpYSopDQogICsgRXN0aW1hY2nDs24gcHJvcGlhIHF1ZSByZWZsZWphIGNvbiBtYXlvciBwcmVjaXNpw7NuIGVsIHZhbG9yIGRlIGxhIHJpcXVlemEgdG90YWwgcHJlc2VudGUgZW4gZWwgc2VjdG9yLiBFbCBWQlAgc2Ugb2J0aWVuZSBhIHBhcml0ciBkZSB2YWx1YXIgbGEgdG90YWxpZGFkIGRlIGxhIHByb2R1Y2Npw7NuIGEgbG9zIHByZWNpb3MgZXh0ZXJub3MgbyBkZSByZWZlcmVuY2lhIGludGVybmFjaW9uYWwgeSBjb24gZWwgdGlwbyBkZSBjYW1iaW8gZGUgcGFyaWRhZCAoVENQKSwgcXVlIG1pZGUgbGEgY2FwYWNpZGFkIHJlYWwgZGUgY29tcHJhIGRlIGxhIG1vbmVkYSBuYWNpb25hbC4gU2luIGVtYmFyZ28sIGNvbW8gZWwgQ0kgY29uc3RpdHV5ZSBpbnRlcmNhbWJpb3MgZGUgbWVyY2FuY8OtYXMgcmVhbGl6YWRhcyBlbiBlbCDDoW1iaXRvIG5hY2lvbmFsLCBkaWNoYSBwYXJ0aWRhIHNlIG9idGllbmUgYSBwYXJ0aXIgZGUgbG9zIHZhbG9yZXMgb2J0ZW5pZG9zIGVuIGxhIHNlcmllIGRlIGVtcGFsbWUgQ0NOTi4gRGUgaWd1YWwgbWFuZXJhLCBzZSB1dGlsaXrDsyBsYSBNUyByZXN1bHRhbnRlIGRlIGVzdGEgw7psdGltYSBlc3RpbWFjacOzbi4gDQoNCg0KDQoNCiMjIEZvcm11bGFjacOzbiBtYXRlbcOhdGljYSBkZSBlc3RpbWFjaW9uZXMNCg0KVmFsb3IgQnJ1dG8gZGUgUHJvZHVjY2nDs24gdG90YWwsIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBwcm9waW8NCiQkVkJQX3twcm9waWF9ID0gKFBleHRfe3BldHLDs2xlb30gKiBRX3twZXRyw7NsZW99ICsgUGV4dF97Z2FzfSAqIFFfe2dhc30pICogVENQJCQNCg0KRG9uZGU6IA0KDQoqICRWQlBfe3Byb3BpYX0kID0gVmFsb3IgQnJ1dG8gZGUgbGEgUHJvZHVjY2nDs24gdG90YWwsIGVzdGltYWNpw7NuIHByb3BpYQ0KKiAkUGV4dF97cGV0csOzbGVvfSQgPSBQcmVjaW8gZGUgZXhwb3J0YWNpw7NuIG8gcmVmZXJlbmNpYSBpbnRlcm5hY2lvbmFsIGRlbCBwZXRyw7NsZW8gY3J1ZG8gKHNlZ8O6biBjb3JyZXNwb25kYSkNCiogJFBleHRfe2dhc30kID0gUHJlY2lvIGRlIGV4cG9ydGFjacOzbiBvIHJlZmVyZW5jaWEgaW50ZXJuYWNpb25hbCBkZWwgZ2FzIG5hdHVyYWwgKHNlZ8O6biBjb3JyZXNwb25kYSkNCiogJFFfe3BldHLDs2xlb30kID0gQ2FudGlkYWRlcyBwcm9kdWNpZGFzIHRvdGFsZXMgZGUgcGV0csOzbGVvIGNydWRvDQoqICRRX3tnYXN9JCA9IENhbnRpZGFkZXMgcHJvZHVjaWRhcyB0b3RhbGVzIGRlIGdhcyBuYXR1cmFsDQoqICRUQ1AkID0gVGlwbyBkZSBDYW1iaW8gZGUgUGFyaWRhZA0KDQoNClZhbG9yIEJydXRvIGRlIFByb2R1Y2Npw7NuIHRvdGFsLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCRWQlBfe0NDTk59ID0gKFBpbnRfe3BldHLDs2xlb30gKiBRTUludF97cGV0csOzbGVvfSArIFBleHRfe3BldHLDs2xlb30gKiBFeHBvX3twZXRyw7NsZW99ICsgUGludF97Z2FzfSAqIFFNSW50X3tnYXN9ICsgUGV4dF97Z2FzfSAqIEV4cG9fe2dhc30pKiBUQ0MkJA0KDQpEb25kZToNCg0KKiAkVkJQX3tDQ05OfSQgPSBWYWxvciBCcnV0byBkZSBsYSBQcm9kdWNjacOzbiB0b3RhbCwgIGVzdGltYWNpw7NuIHByb3BpYSBjb24gY3JpdGVyaW8gZGUgbGFzIENDTk4NCiogJFBpbnRfe3BldHLDs2xlb30kID0gUHJlY2lvIG1lcmNhZG8gaW50ZXJubyBkZWwgcGV0csOzbGVvIGNydWRvDQoqICRQaW50X3tnYXN9JCA9IFByZWNpbyBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsDQoqICRRTUludF97cGV0csOzbGVvfSQgPSBjYW50aWRhZGVzIHZlbmRpZGFzIGFsIG1lcmNhZG8gaW50ZXJubyBkZSBwZXRyw7NsZW8gY3J1ZG8NCiogJFFNSW50X3tnYXN9JCA9IGNhbnRpZGFkZXMgdmVuZGlkYXMgYWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBnYXMgbmF0dXJhbA0KKiAkRXhwb197cGV0csOzbGVvfSQgPSBleHBvcnRhY2lvbmVzIGRlIHBldHLDs2xlbyBjcnVkbw0KKiAkRXhwb197Z2FzfSQgPSBleHBvcnRhY2lvbmVzIGRlIGdhcyBuYXR1cmFsDQoqICRUQ0MkID0gVGlwbyBkZSBDYW1iaW8gQ29tZXJjaWFsDQoNCg0KPGJyPg0KDQpWYWxvciBCcnV0byBkZSBQcm9kdWNjacOzbiBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCg0KJCRWQlBcX2V4dHJfe0NDTk59ID0gVkJQX3tDQ05OfSAqICgxLXByb3BcX3NlcnZpY2lvcykkJA0KDQpEb25kZToNCg0KKiAkVkJQXF9leHRyX3tDQ05OfSQgPSBWYWxvciBCcnV0byBkZSBsYSBQcm9kdWNjacOzbiBleHRyYWNjacOzbiwgIGVzdGltYWNpw7NuIHByb3BpYSBjb24gY3JpdGVyaW8gZGUgbGFzIENDTk4NCiogJHByb3BcX2V4dHIkID0gcHJvcG9yY2nDs24gZGVsIFZCUCBkZSBzZXJ2aWNpb3MgZGUgYXBveW8gc29icmUgVkJQIGRlIGV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyB5IGdhcw0KDQoNClByb3BvcmNpw7NuIGRlIGxvcyBzZXJ2aWNpb3MgZGUgYXBveW8gc29icmUgbGEgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzDQo8YnI+DQokJHByb3BcX3NlcnZpY2lvcyA9IFxmcmFje1ZCUFxfc2VydmljaW9zX3tDT1V9fXtWQlBcX2V4dHJfe0NPVX0gKyBWQlBcX3NlcnZpY2lvc197Q09VfX0kJA0KDQpEb25kZToNCg0KKiAkVkJQXF9zZXJ2aWNpb3Nfe0NPVX0kID0gVkJQIGRlIHNlcnZpY2lvcyBkZSBhcG95byBkZWwgQ3VhZHJvIGRlIFV0aWxpemFjacOzbiBkZSBPZmVydGENCiogJFZCUFxfZXh0cmFjY2nDs25fe0NPVX0kID0gVkJQIGRlIGV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyB5IGdhcyBkZWwgQ3VhZHJvIGRlIFV0aWxpemFjacOzbiBkZSBPZmVydGENCg0KDQoNCjxicj4NCkNvbnN1bW8gSW50ZXJtZWRpbywgdmFsb3JlcyBvZmljaWFsZXMgZGUgbGFzIENDTk4NCiQkIENJX3tDQ05OfSA9IFZCUF97Q0NOTn0gLSAgVkFfe0NDTk59ICQkDQoNCkRvbmRlOg0KDQoqICRDSV97Q0NOTn0kID0gQ29uc3VtbyBJbnRlcm1lZGlvIHRvdGFsLCBlc3RpbWFjacOzbiBwcm9waWENCiogJFZBX3tDQ05OfSQgPSBWYWxvciBBZ3JlZ2FkbywgZXN0aW1hY2nDs24gZGUgbGFzIENDTk4gDQoNCjxicj4NCkNvbnN1bW8gSW50ZXJtZWRpbywgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCiQkIENJX3tDQ05OfSA9IFZCUF97Q0NOTn0gKiAgQ29lZlxfdGVjICQkDQpEb25kZToNCg0KKiAkQ29lZlxfdGVjJCA9IENvZWZpY2llbnRlIHTDqWNuaWNvIGRlIE1hdHJpeiBJbnN1bW8gUHJvZHVjdG8NCg0KPGJyPg0KQ29uc3VtbyBJbnRlcm1lZGlvIGRlIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KDQokJCBDSVxfZXh0cl97Q0NOTn0gPSBWQlBcX2V4dHJfe0NDTk59ICogIENvZWZcX3RlYyAkJA0KDQpEb25kZToNCg0KKiAkIENJXF9leHRyX3tDQ05OfSQgPSBDb25zdW1vIEludGVybWVkaW8gZGUgZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIGNyaXRlcmlvIENDTk4NCg0KPGJyPg0KTWFzYSBTYWxhcmlhbCwgdmFsb3JlcyBvZmljaWFsZXMgZGUgbGFzIENDTk4NCiQkTVMgPSBXICogRW1wICogMTMkJA0KRG9uZGU6IA0KDQoqICRNUyQgPSBNYXNhIFNhbGFyaWFsIA0KKiAkVyQgPSAgU2FsYXJpbyBhbnVhbCBwcm9tZWRpbw0KKiAkRW1wJCA9IEVtcGxlbw0KDQo8YnI+DQpNYXNhIFNhbGFyaWFsLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCRNUyA9ICBWQlBfe0NDTk59ICogIENvZWZcX01TJCQNCg0KRG9uZGU6IA0KDQoqICRDb2VmXF9NUyQgPSBDb2VmaWNpZW50ZSBkZSBsYSBwcm9wb3JjacOzbiBkZSBNUyBzb2JyZSBWQlANCg0KPGJyPg0KTWFzYSBTYWxhcmlhbCBkZSBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCiQkTVNcX2V4dHIgPSAgVkJQXF9leHRyX3tDQ05OfSAqICBDb2VmXF9NUyQkDQoNCkRvbmRlOiANCg0KICAqICRNU1xfZXh0ciQgPSBNYXNhIHNhbGFyaWFsIGRlbCBzZWN0b3IgZXh0cmFjY2nDs24NCg0KPGJyPg0KVmFsb3IgYWdyZWdhZG8sIGVzdGltYWNpw7NuIGNyaXRlcmlvIENDTk4NCiQkVkFfe0NDTk59ICA9IFZCUF97Q0NOTn0g4oCTIENJX3tDQ05OfSAkJA0KRG9uZGU6DQoNCiogJFZBX3tDQ05OfSQgPSBWYWxvciBBZ3JlZ2FkbywgZXN0aW1hY2nDs24gcHJvcGlhIGNvbiBjcml0ZXJpbyBDQ05ODQoNCjxicj4NClZhbG9yIGFncmVnYWRvIGRlIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCRWQVxfZXh0cl97Q0NOTn0gID0gVkJQXF9leHRyX3tDQ05OfSDigJMgQ0lcX2V4dHJfe0NDTk59ICQkDQoNCkRvbmRlOg0KDQoqICRWQVxfZXh0cl97Q0NOTn0kID0gVmFsb3IgQWdyZWdhZG8gZGUgZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIHByb3BpYSBjb24gY3JpdGVyaW8gQ0NOTiANCg0KDQo8YnI+DQpWYWxvciBhZ3JlZ2FkbywgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIHByb3Bpbw0KJCRWQV97cHJvcGlhfSAgPSBWQlBfe3Byb3BpYX0g4oCTIENJXF9leHRyX3tDQ05OfSAkJA0KDQpEb25kZToNCg0KKiAkVkFfe3Byb3BpYX0kID0gVmFsb3IgQWdyZWdhZG8sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBwcm9waW8gDQoNCg0KPGJyPg0KDQpFeGNlZGVudGUgQnJ1dG8gZGUgRXhwbG90YWNpw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCRFQkVfe0NDTk59ICA9IFZBX3tDQ05OfSDigJMgTVMgICAkJA0KPGJyPg0KDQpFeGNlZGVudGUgQnJ1dG8gZGUgRXhwbG90YWNpw7NuIGRlIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCRFQkVcX2V4dHJfe0NDTk59ICA9IFZBXF9leHRyX3tDQ05OfSDigJMgTVNcX2V4dHIgICAkJA0KDQo8YnI+DQoNCkV4Y2VkZW50ZSBCcnV0byBkZSBFeHBsb3RhY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBwcm9waW8NCiQkRUJFX3twcm9waWF9ICA9IFZBX3twcm9waWF9IOKAkyBNU1xfZXh0ciAgICQkDQoNCkRvbmRlOg0KDQoqICRFQkUkID0gRXhjZWRlbnRlIEJydXRvIGRlIEV4cGxvdGFjacOzbg0KKiAkQ0lcX2V4dHJfe0NDTk59JCA9IENvbnN1bW8gaW50ZXJtZWRpbyBkZWwgc2VjdG9yIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KDQoNCjxicj4NCkNvbnN1bW8gZGUgQ2FwaXRhbCBGaWpvLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gcHJvcGlvDQokJENvbktmaWpvID0gUFB5RSAqICBwcm9tKFxmcmFje0RlcH17UFB5RX0pICQkDQoNCkRvbmRlOiANCg0KKiAkQ29uS2Zpam8kID0gQ29uc3VtbyBkZSBDYXBpdGFsIEZpam8NCiogJFBQeUUkPSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyBuZXRhDQoqICRwcm9tKFxmcmFje0RlcH17UFB5RX0pICQgPSAgdGFzYSBkZSBkZXByZWNpYWNpw7NuIHByb21lZGlvDQoqICREZXAkID0gRGVwcmVjaWFjaW9uZXMgKGN1ZW50YSBnYXN0b3MgcG9yIG5hdHVyYWxlemEpDQoNCjxicj4NCg0KUGx1c3ZhbMOtYSAoRXhjZWRlbnRlIE5ldG8gZGUgRXhwbG90YWNpw7NuKSwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIHByb3Bpbw0KJCRQVl97cHJvcGlhfSA9IFZBX3twcm9waWF9IC0gQ29uS2Zpam8gLSBJbXAgJCQNCg0KDQpEb25kZToNCg0KKiAkUFZfe3Byb3BpYX0kID0gUGx1c3ZhbMOtYSAoKkV4Y2VkZW50ZSBOZXRvIGRlIEV4cGxvdGFjacOzbiopDQoqICRJbXAkID0gSW1wdWVzdG9zIG5vcm1hbGVzDQoNCg0KDQojIEZ1ZW50ZXMgcGFyYSBsYSBjb25zdHJ1Y2Npw7NuIGRlIHNlcmllcyBkZSBsYXJnbyBwbGF6bw0KDQoqIFByb2R1Y2Npw7NuIGRlIENydWRvOiANCiAgKyAxOTExIGEgMTk5MjogQW51YXJpbyBkZSBjb21idXN0aWJsZXMgDQogICsgMTk5MyAtIGFjdHVhbGlkYWQ6IFNFU0NPIERvd25zdHJlYW0NCiAgDQoqIEV4cG9ydGFjaW9uZXMgZGUgQ3J1ZG86IA0KICArIDE5NjIgYSAxOTkzOiBVTiBDb210cmFkZSAoY2xhc2lmaWNhY2nDs24gU0lUQyBhcyByZXBvcnRlZCkNCiAgKyAxOTk0IGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQogICsgTG9zIGRhdG9zIGZhbHRhbnRlcyBkZSBTRVNDTyBzZSBjb21wbGV0YXJvbiBjb24gTUVDT04NCiAgKyBTaWd1ZW4gaGFiaWVuZG8gZGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIDE5NjUsIDE5NzAtNzQsIDE5NzYtNzgsIDE5ODAtODQNCiAgDQoqIFByZWNpbyBNZXJjYWRvIEludGVybm8gZGUgQ3J1ZG86IA0KICArIDE5NjMgYSAxOTY1OiBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUgYWp1c3RhZG8gY29uIGVsIMOtbmRpY2UgZGVsIHByZWNpbyBkZWwgQW51YXJpbyBkZSBZUEYgDQogICsgMTk4OSBhIDE5OTE6IEFudWFyaW8gZGUgWVBGDQogICsgMTk2NiBhIDE5ODg6IEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRQ0KICArIDE5OTI6IE1FQ09OIGFqdXN0YWRvIGNvbiBsYSB2YXJpYWNpw7NuIGRlbCDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYWwgcG9yIG1heW9yIChJUElNKQ0KICArIDE5OTMgZW4gYWRlbGFudGU6IE1FQ09OIA0KICANCiogUHJlY2lvIE1lcmNhZG8gRXh0ZXJubyBDcnVkbzoNCiAgKyBlbnRyZSAxOTYyIHkgMTk5MjogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUNCiAgKyBlbnRyZSAxOTkzLTIwMDEgeSAyMDA0LTIwMTQ6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIE1lY29uDQogICsgZW50cmUgMjAwMiB5IDIwMDM6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gZGUgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlIChDbGFzaWZpY2FjacOzbiBIUyBhcyByZXBvcnRlZCkgIA0KICArIDIwMTQgZW4gYWRlbGFudGU6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChSZWdhbMOtYXMpDQogICsgVmFsb3JlcyBmYWx0YW50ZXMgcHJldmlvcyBhIDE5OTI6IEJyZW50ICAoRnVlbnRlOiBJbmZsYXRpb24gRGF0YSkNCiAgDQoqIFByb2R1Y2Npw7NuIGRlIEdhczoNCiAgKyAxOTExIGEgMTk5MjogQW51YXJpbyBkZSBjb21idXN0aWJsZXMgDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICANCiogRXhwb3J0YWNpb25lcyBkZSBnYXM6IA0KICArIDE5NjIgYSAxOTk2OiBVTiBDb210cmFkZSwNCiAgKyAxOTk3IGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQogICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIDE5OTkgeSAyMDAwDQogIA0KKiBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIGdhczoNCiAgKyAxOTYzIC0gMTk2OSAmIDE5ODkgLSAxOTkyOiBBbnVhcmlvIGRlIFlQRg0KICArIDE5NzAgLSAxOTg4OiAgS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgLSBCYXNlIFJlZ2Fsw61hcw0KICANCiogUHJlY2lvIE1lcmNhZG8gRXh0ZXJubzoNCiAgKyBBw7FvcyAxOTY0IHkgMTk2NTogUHJlY2lvIGRlIGltcG9ydGFjacOzbiBkZSBnYXMgcHJvdmVuaWVudGUgZGUgQm9saXZpYSBoYWNpYSBBcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUNCiAgKyAxOTY2IGVuIGFkZWxhbnRlOiBQcmVjaW8gZGUgZXhwb3J0YWNpb24gZGUgZ2FzIGRlc2RlIEJvbGl2aWEgYSBBcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUNCiAgKyBEYXRvcyBmYWx0YW50ZXMgcGFyYSBsb3MgYcOxb3MgcHJldmlvcyBhIDE5NjMgeSBwZXLDrW9kbyAxOTY4LTE5NzEgDQoNCiogVmFsb3IgQnJ1dG8gZGUgbGEgUHJvZHVjY2nDs24sIFZhbG9yIEFncmVnYWRvIHkgQ29uc3VtbyBJbnRlcm1lZGlvOg0KICArIElOREVDIC0gRGlyZWNjacOzbiBOYWNpb25hbCBkZSBDdWVudGFzIE5hY2lvbmFsZXMgKEJhc2UgTWluZXLDrWEgZSBIaWRyb2NhcmJ1cm9zIGRlIGxhcyBDdWVudGFzIE5hY2lvbmFsZXMpLiBMYXMgdmFyaWFibGVzICJleHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MiIHJlZmllcmVuIGEgIkV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyB5IGdhcyBuYXR1cmFsLiBBY3RpdmlkYWRlcyBkZSBzZXJ2aWNpb3MgcmVsYWNpb25hZGFzIGNvbiBsYSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMsIGV4Y2VwdG8gbGFzIGFjdGl2aWRhZGVzIGRlIHByb3NwZWNjacOzbiINCiAgKyBDw6FsY3VsbyBwcm9waW8gZGVsIFZCUCBjb24gZGF0b3MgZGF0b3MgZGUgcHJvZHVjY2nDs24geSBwcmVjaW8gaW50ZXJuYWNpb25hbCByZWNvcGlsYWRvcy4gTGFzIGZ1ZW50ZXMgc29uIGxhcyBzaWd1aWVudGVzIChsb3MgY3JpdGVyaW9zIHNvbiBsb3MgbWlzbW9zIHBhcmEgbGEgdXRpbGl6YWNpw7NuIHBvc3RlcmlvciBlbiBlbCBjw6FsY3VsbyBkZSByZW50YSBkZSBsYSB0aWVycmEgaGlkcm9jYXJidXLDrWZlcmEgcG9yIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MsIHNvYnJldmFsdWFjacOzbiBjYW1iaWFyaWEgeSBvdHJvcyBtZWNhbmlzbW9zKQ0KDQoqIFNhbGFyaW8geSBlbXBsZW8NCiAgKyAxOTYwLTE5OTY6IGVzdGltYWNpw7NuIGEgcGFydGlyIGRlIGFwbGljYWNpw7NuIGRlbCBjb2VmaWNpZW50ZSBkZSBwcm9wb3JjacOzbiBkZSBsYSBtYXNhIHNhbGFyaWFsIHNvYnJlIGVsIFZCUA0KICArIDE5OTYgZW4gYWRlbGFudGU6IE1pbmlzdGVyaW8gZGUgVHJhYmFqbywgRW1wbGVvIHkgU2VndXJpZGFkIFNvY2lhbCAtIE9ic2VydmF0b3JpbyBkZSBFbXBsZW8geSBEaW7DoW1pY2EgRW1wcmVzYXJpYWwgKE9FREUpDQoNCiogQ29uc3VtbyBkZSBjYXBpdGFsIGZpam8NCiAgKyBDb2VmaWNpZW50ZSBkZSBkZXByZWNpYWNpw7NuIGVzdGltYWRvIGEgcGFydGlyIGRlIEVzdGFkb3MgQ29udGFibGVzIGRlIFlQRiAoMTk5OC0yMDE4KQ0KPGJyPg0KDQoNCg0KDQrCt8K3wrfCt8K3wrfCt8K3wrfCt8K3wrfCt8K3wrfCt8K3wrfCt8K3wrfCt8K3DQoqIENyaXRlcmlvIGRlIGPDs21wdXRvIGRlIGxhIHByb2R1Y2Npw7NuIGRlIGdhczoNCiAgKyAxOTExIGEgMTk5MjogQW51YXJpbyBkZSBjb21idXN0aWJsZXMgDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICANCiAgKiBDcml0ZXJpbyBkZSBjw7NtcHV0byBwYXJhIHByb2R1Y2ljw7NuIGRlIGNydWRvOiANCiAgKyAxOTExIGEgMTk5MjogQW51YXJpbyBkZSBjb21idXN0aWJsZXMgDQogICsgMTk5MyAtIGFjdHVhbGlkYWQ6IFNFU0NPIERvd25zdHJlYW0NCiAgDQoqIENyaXRlcmlvIHBhcmEgcHJlY2lvX2NydWRvOiANCiAgKyAxOTYzIGEgMTk2NTogS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFIGFqdXN0YWRvIGNvbiBlbCDDrW5kaWNlIGRlbCBwcmVjaW8gZGVsIEFudWFyaW8gZGUgWVBGIA0KICArIDE5ODkgYSAxOTkxOiBBbnVhcmlvIGRlIFlQRg0KICArIDE5NjYgYSAxOTg4OiBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUNCiAgKyAxOTkyOiBNRUNPTiBhanVzdGFkbyBjb24gbGEgdmFyaWFjacOzbiBkZWwgw41uZGljZSBkZSBwcmVjaW9zIGludGVybm9zIGFsIHBvciBtYXlvciAoSVBJTSkNCiAgKyAxOTkzIGVuIGFkZWxhbnRlOiBNRUNPTiANCiANCg0KKiBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIGdhczoNCiAgKyAxOTYzIC0gMTk2OSAmIDE5ODkgLSAxOTkyOiBBbnVhcmlvIGRlIFlQRg0KICArIDE5NzAgLSAxOTg4OiAgS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgLSBCYXNlIFJlZ2Fsw61hcw0KICArIEHDsW9zIGZhbHRhbnRlczogWy4uLl0NCiAgDQoNCiogRnVlbnRlcyBzZWxlY2Npb25hZGFzIHBhcmEgZWwgcHJlY2lvIGRlIHJlZmVyZW5jaWEgZGUgY3J1ZG86IA0KICArIGVudHJlIDE5NjIgeSAxOTkyOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBVTiBDb210cmFkZSAoY2xhc2lmaWNhY2nDs24gU0lUQyBhcyByZXBvcnRlZCkNCiAgKyBlbnRyZSAxOTkzLTIwMDEgeSAyMDA0LTIwMTQ6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIE1lY29uDQogICsgZW50cmUgMjAwMiB5IDIwMDM6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gZGUgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlIChDbGFzaWZpY2FjacOzbiBIUyBhcyByZXBvcnRlZCkNCiAgKyAyMDE0IGVuIGFkZWxhbnRlOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAoUmVnYWzDrWFzKQ0KICArIFZhbG9yZXMgZmFsdGFudGVzIHByZXZpb3MgYSAxOTkyICgxOTcwIC0gMTk4NSk6IEJyZW50IChGdWVudGU6IEluZmxhdGlvbiBEYXRhKQ0KDQoNCiogQ3JpdGVyaW8gZGUgcHJlY2lvX2V4dGVybm9fZ2FzOg0KICArIEHDsW9zIDE5NjQgeSAxOTY1OiBQcmVjaW8gZGUgaW1wb3J0YWNpw7NuIGRlIGdhcyBwcm92ZW5pZW50ZSBkZSBCb2xpdmlhIGhhY2lhIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZQ0KICArIDE5NjYgZW4gYWRlbGFudGU6IFByZWNpbyBkZSBleHBvcnRhY2lvbiBkZSBnYXMgZGVzZGUgQm9saXZpYSBhIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZQ0KICArIERhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyBwcmV2aW9zIGEgMTk2MyB5IHBlcsOtb2RvIDE5NjgtMTk3MQ0KICANCg0KKiBFeHBvcnRhY2lvbmVzIGRlIGNydWRvOiANCiAgKyAxOTYyIGEgMTk5MzogVU4gQ29tdHJhZGUNCiAgKyAxOTk0IGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQogICsgTG9zIGRhdG9zIGZhbHRhbnRlcyBkZSBTRVNDTyBzZSBjb21wbGV0YXJvbiBjb24gTUVDT04NCiAgKyBTaWd1ZW4gaGFiaWVuZG8gZGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIDE5NjUsIDE5NzAtNzQsIDE5NzYtNzgsIDE5ODAtODQNCg0KDQoqIEZ1ZW50ZXMgc2VsZWNjaW9uYWRhczoNCiArIDE5NjIgYSAxOTk2OiBVTiBDb210cmFkZSwNCiArIDE5OTcgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCiArIERhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyAxOTk5IHkgMjAwMA0KDQoNCmBgYHtyfQ0KdmFsb3JfdG90YWxfcHJvZHVjY2lvbiA9IHJlYWQuY3N2KCIuLi9yZXN1bHRhZG9zL2RhdGFfdml6L3ZhbG9yX3RvdGFsX3Byb2R1Y2Npb24uY3N2IikNCmdyYWZfdmFsb3JfcHJvZHVjY2lvbiA8LSB2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JQ0KICBmaWx0ZXIoYW5pbyA+IDE5NjApICU+JQ0KICBnZ3Bsb3QoIGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBmdWVudGUpKSsNCiAgZ2VvbV9saW5lKGFscGhhID0gMC43KSsNCiAgZ2VvbV9wb2ludChzaXplID0gMC40MzUsIGFscGhhID0gMC4yKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiVmFsb3IgZGUgbGEgUHJvZHVjY2nDs24gaGlkcm9jYXJidXLDrWZlcmEiLA0KICAgICAgIHN1YnRpdGxlID0gIlZhbG9yIHRvdGFsIHkgY29tcG9uZW50ZXMiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICBmYWNldF93cmFwKH52YXJpYWJsZSkNCmdwIDwtIGdncGxvdGx5KGdyYWZfdmFsb3JfcHJvZHVjY2lvbikjLCB3aWR0aCA9IDc1MCwgaGVpZ2h0ID0gNzAwKQ0KZ3BbWyd4J11dW1snbGF5b3V0J11dW1snYW5ub3RhdGlvbnMnXV1bWzJdXVtbJ3gnXV0gPC0gLTAuMTENCmdwICU+JSBsYXlvdXQobWFyZ2luID0gbGlzdChsID0gNzUpKQ0KYGBgDQoNCg0KIyBSZW50YSBkZSBsYSB0aWVycmEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwuIEVuIHByZWNpb3MgY29uc3RhbnRlcywgc29icmUgUGx1c3ZhbMOtYSBUb3RhbCB5IFBCSQ0KDQpFeGlzdGVuIGRvcyBjYW1pbm9zIHBhcmEgbGxlZ2FyIGFsIG1vbnRvIHRvdGFsIGRlIHJlbnRhIGRlIGxhIHRpZXJyYSBoaWRyb2NhcmJ1csOtZmVyYTogdW5vIGVzIGRlc2NvbnRhbmRvIGxhIGdhbmFuY2lhIG5vcm1hbCBkZSBsYXMgZW1wcmVzYXMgYSBsYSBwbHVzdmFsw61hIHRvdGFsIGRlbCBzZWN0b3IgeSBlbCBvdHJvIGVzIHBvciBtZWRpbyBkZSBsYSBzdW1hIGRlIG1lY2FuaXNtb3MgZGUgYXByb3BpYWNpw7NuLg0KDQokJFJlbnRhXF9oaWRyb2NhcmJ1csOtZmVyYSA9IFBWX3toaWRyb2NhcmJ1csOtZmVyYX0gLSBHY2lhXF9Ob3JtYWxfe2hpZHJvY2FyYnVyw61mZXJhfSQkDQoNCkRvbmRlOg0KDQoqICRHY2lhXF9Ob3JtYWxfe2hpZHJvY2FyYnVyw61mZXJhfSQgPSBHYW5hbmNpYSBOb3JtYWwgZGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybw0KKiAkUFZfe2hpZHJvY2FyYnVyw61mZXJhfSQgPSBQbHVzdmFsw61hIGRlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm8gIA0KDQokJEdjaWFcX05vcm1hbF97aGlkcm9jYXJidXLDrWZlcmF9ID0gS1RBX3toaWRyb2NhcmJ1csOtZmVyb30gKiBUR197cmVmZXJlbmNpYX0kJA0KDQoNCkRvbmRlOg0KDQoqICRLVEFfe2hpZHJvY2FyYnVyb3N9JCA9IFN0b2NrIGRlIGNhcGl0YWwgYWRlbGFudGFkbyBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvIA0KKiAkVEdfe3JlZmVyZW5jaWF9JCA9IFRhc2EgZGUgZ2FuYW5jaWEgbm9ybWFsIGRlIHJlZmVyZW5jaWEuDQoNCkVuIGVzdGUgY2Fzbywgc2VsZWNjaW9uYW1vcyBsYSB0YXNhIGRlIGdhbmFuY2lhIGRlbCBzZWN0b3IgaW5kdXN0cmlhbCBjb21vIHBhcsOhbWV0cm8gcGFyYSBkaWZlcmVuY2lhciBsYSByZW50YSBkZSBsYSBnYW5hbmNpYS4gQSBzdSB2ZXosIHBhcmEgZWwgY2FwaXRhbCB0b3RhbCBhZGVsYW50YWRvIGRlIGxhcyBlbXByZXNhcyBoaWRyb2NhcmJ1csOtZmVyYXMsIHNlbGVjY2lvbmFtb3MgdW5pY2FtZW50ZSBlbCB2YWxvciByZXN1bHRhbnRlIGRlIGxhIGVzdGltYWNpw7NuIGRlIGxhIFBQeUUgZGUgQm9sc2FyLCBwb3IgbG8gcXVlIGxlIGZhbHRhbiBsb3MgaW52ZW50YXJpb3MgeSBzYWxhcmlvcyBhZGVsYW50YWRvcy4NCg0KRWwgY8OhbGN1bG8gZGUgcmVudGEgdG90YWwgaGlkcm9jYXJidXLDrWZlcmEgcXVlIHNlIG9idGllbmUgcG9yIG1lZGlvIGRlIGRlc2NvbnRhciBsYSBnYW5hbmNpYSBub3JtYWwgYSBsYSBwbHVzdmFsw61hIHRvdGFsIGRlbCBzZWN0b3IsIGRlYmUgc2VyIGlndWFsIGEgbGEgcmVudGEgb2J0ZW5pZGEgcG9yIG1lZGlvIGRlIGxhIGFncmVnYWNpw7NuIGRlIGxvcyBkaXN0aW50b3MgbWVjYW5pc21vcyBkZSBhcHJvcGlhY2nDs24uIEVzIGRlY2lyOg0KDQokJFJlbnRhXF9oaWRyb2NhcmJ1csOtZmVyYSA9IFJlbnRhXF9kaWZlcmVuY2lhbFxfcHJlY2lvcyArIFJlbnRhXF9zb2JyZXZhbHVhY2nDs24gKyBSZW50YVxfZW1wcmVzYXMgKyBJbXB1ZXN0b3NcX25ldG9zXF9lc3BlY8OtZmljb3MgJCQNCiQkSW1wdWVzdG9zXF9uZXRvc1xfZXNwZWPDrWZpY29zID0gUmV0ZW5jaW9uZXMgKyBSZWdhbMOtYXMgLSBTdWJzaWRpb3MkJA0KDQojIyBSZW50YSBkZSBsYSB0aWVycmEgY2FsY3VsYWRhIGEgcGFydGlyIGRlIGRlc2N1ZW50b3Mgc29icmUgZWwgdmFsb3IgYnJ1dG8gZGUgcHJvZHVjY2nDs24gKG3DqXRvZG8gZGlyZWN0bykNCmBgYHtyfQ0KZ3JhZl9yZW50YV9kaXJlY3RvX3BiaSA8LSByZW50YV9kaXJlY3RvX3BiaSAlPiUNCiAgc2VsZWN0KGFuaW8sIHJlbnRhX3B2LHJlbnRhX3BiaSApICU+JQ0KICAjIGZpbHRlcihhbmlvID49IDE5NjIsIGZ1ZW50ZV9nY2lhID09ICJQcm9waWEiKSAlPiUNCiAgZmlsdGVyKGFuaW8gPj0gMTk2MikgJT4lDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6MykgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IpKSsNCiAgIyBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBnZW9tX2xpbmUoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgc29icmUgUEJJIHkgR2FuYW5jaWFzIFRvdGFsZXMiLA0KICAgICAgIHN1YnRpdGxlID0gIkEgcGFydGlyIGRlIGVzdGltYWNpw7NuIHByb3BpYSBkZWwgVkJQIiwNCiAgICAgICB5ID0gIiUiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMikpKw0KICBmYWNldF9ncmlkKH50aXBvX3JlbnRhICkNCmdyYWZfcmVudGFfZGlyZWN0b19wYmkNCiMgZ2dwbG90bHkoZ3JhZl9yZW50YV9kaXJlY3RvX3BiaSwgaGVpZ2h0ID0gNDAwLCB3aWR0aCA9IDYwMCkNCg0KYGBgDQoNCg0KIyMgUmVudGEgZGUgbGEgdGllcnJhIGNhbGN1bGFkYSBhIHBhcnRpciBkZSBzdW1hIGRlIG1lY2FuaXNtb3MgZGUgYXByb3BpYWNpw7NuIChtw6l0b2RvIGluZGlyZWN0bykNCg0KIyMjIEltcHVlc3RvcyB5IHN1YnNpZGlvcw0KDQojIyMjIFJlZ2FsaWFzDQoNCiMjIyMgUmV0ZW5jaW9uZXMNCg0KIyMjIyBTdWJzaWRpb3MNCg0KYGBge3J9DQojICMjIyMjIyBwcm9wb3JjaW9uIHN1YnNpZGlvcyAodmllbmUgZGVsIHNjcmlwdCBwcmVwcm9jZXNhbWllbnRvKQ0KIyByZW50YV9pbmRpcmVjdG9bLGMoImFuaW8iLCJwcm9wb3JjaW9uX3N1YnNpZGlvcyIpXSAlPiUgYXJyYW5nZSgtYW5pbykNCiMgcmVudGFfZGlyZWN0byAlPiUNCiMgICBtdXRhdGUocGVzb19zdWJzaWRpb3MgPSBzdWJzaWRpb3MvcmVudGFfdG90YWwsDQojICAgICAgICAgIG1ldG9kbyA9ICJEaXJlY3RvIikgJT4lDQojICAgICAgICAgIHNlbGVjdChhbmlvLCBtZXRvZG8sIHBlc29fc3Vic2lkaW9zLCByZW50YV90b3RhbCkgJT4lDQojICAgcmJpbmQocmVudGFfaW5kaXJlY3RvICU+JQ0KIyAgICAgICAgICAgbXV0YXRlKHBlc29fc3Vic2lkaW9zID0gc3Vic2lkaW9zL3JlbnRhX3RvdGFsLA0KIyAgICAgICAgICAgICAgICAgIG1ldG9kbyA9ICJJbmRpcmVjdG8iKSAlPiUNCiMgICAgICAgICAgIHNlbGVjdChhbmlvLG1ldG9kbywgIHBlc29fc3Vic2lkaW9zLCByZW50YV90b3RhbCkpICU+JQ0KIyAgIGZpbHRlcihhbmlvID4gMjAwNCkgJT4lDQojICAgcmVzaGFwZTI6Om1lbHQoaWQudmFycyA9IGMoImFuaW8iLCAibWV0b2RvIikpICU+JQ0KIyAgIGdncGxvdChhZXMoYW5pbywgdmFsdWUsIGNvbG9yID0gbWV0b2RvKSkrDQojICAgZ2VvbV9saW5lKCkrDQojIGZhY2V0X3dyYXAofnZhcmlhYmxlLHNjYWxlcz0gImZyZWUiKQ0KYGBgDQoNCg0KIyMjIFN1bWEgZGUgbWVjYW5pc21vcyANCmBgYHtyfQ0KcmVudGFfbWVjYW5pc21vcyA9IGFzLmRhdGEudGFibGUocmVhZF9leGNlbCgiLi4vcmVzdWx0YWRvcy9hcmdlbnRpbmEvcmVudGFfZGVfbGFfdGllcnJhX2hpZHJvY2FyYnVyaWZlcmFfYXJnLnhsc3giLCBzaGVldCA9ICJSVFBHX21lY2FuaXNtb3MiKSkNCiANCnJlbnRhX21lY2FuaXNtb3MgPSByZW50YV9tZWNhbmlzbW9zWywhYygiUnR0IiwgIklQQ18xOCIsICJ1bmlkYWQiKSwgd2l0aCA9IEZdIA0KcmVudGFfbWVjYW5pc21vc1ssIFN1YnMgOj0gU3VicyAqLTFdDQpyZW50YV9tZWNhbmlzbW9zID0gbWVsdChyZW50YV9tZWNhbmlzbW9zLCBpZC52YXJzID0gImFuaW8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJ0aXBvX3JlbnRhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAidmFsb3IiKQ0KcmVudGFfbWVjYW5pc21vcyA9IFJlZHVjZShtZXJnZV9mdW5jLCBsaXN0KHJlbnRhX21lY2FuaXNtb3MsIHRjcF9hcmcsIGlwY191cykpDQpyZW50YV9tZWNhbmlzbW9zWywgdmFsb3IgOj0gKCh2YWxvci8xZTYpL1RDcCkvaXBjX3VzXzIwXQ0KcmVudGFfbWVjYW5pc21vc1ssIHVuaWRhZCA6PSAiTWlsbG9uZXMgZGUgVVNEIFRDcCBkZSAyMDIwIl0NCg0KcmVudGFfcGxvdDMgPSBnZ3Bsb3QocmVudGFfbWVjYW5pc21vcywgYWVzKGFuaW8sIHZhbG9yLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSB0aXBvX3JlbnRhLCBmaWxsID0gdGlwb19yZW50YSkpKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJzdGFjayIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgZGUgbGEgdGllcnJhIGhpZHJvY2FyYnVyw61mZXJhIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJDdXJzb3MgZGUgYXByb3BpYWNpw7NuIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIFVTRCBUQ2MgZGUgMjAyMCIpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5NjAsIDIwMjAsIDUpKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA1MDAwMCwgMTAwMDApLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkrDQogIHRoZW1lX2NsYXNzaWMoKQ0KcmVudGFfcGxvdDMgPSBwbG90X3RoZW1lKHJlbnRhX3Bsb3QzKSt0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3Q9IDAuNywgaGp1c3Q9IDAuNSkpDQpyZW50YV9wbG90Mw0KZ2dzYXZlKCIuLi9yZXN1bHRhZG9zL2FyZ2VudGluYS9yZW50YV9tZWNhbmlzbW9zX3RjcC5wbmciLHJlbnRhX3Bsb3QzKQ0KYGBgDQoNCg0KDQojIENvbXBhcmFjacOzbiBkZSBlc3RpbWFjaW9uZXMgcHJvcGlhcw0KDQpgYGB7cn0NCnJlbnRhX3BleHRxID0gcmVhZF9leGNlbCgiLi4vcmVzdWx0YWRvcy9hcmdlbnRpbmEvcmVudGFfZGVfbGFfdGllcnJhX2hpZHJvY2FyYnVyaWZlcmFfYXJnLnhsc3giLCBzaGVldCA9ICJSVFBHX1BleHRRIikgJT4lIA0KICBzZWxlY3QoYW5pbyAsdW5pZGFkLCB2YWxvciA9IFJ0dCkgJT4lIA0KICBtdXRhdGUodmFyID0gIlJlbnRhIHBvciBkZXNjdWVudG9zIHNvYnJlIHBsdXN2YWzDrWEiKQ0KDQpyZW50YV9tZWNhbmlzbW9zID0gcmVhZF9leGNlbCgiLi4vcmVzdWx0YWRvcy9hcmdlbnRpbmEvcmVudGFfZGVfbGFfdGllcnJhX2hpZHJvY2FyYnVyaWZlcmFfYXJnLnhsc3giLCBzaGVldCA9ICJSVFBHX21lY2FuaXNtb3MiKSAlPiUgDQogIHNlbGVjdChhbmlvICx1bmlkYWQsIHZhbG9yID0gUnR0KSAlPiUgDQogIG11dGF0ZSh2YXIgPSAiUmVudGEgcG9yIHN1bWEgZGUgbWVjYW5pc21vcyIpDQoNCg0KcmVudGFfYXJnID0gYXMuZGF0YS50YWJsZShyYmluZChyZW50YV9wZXh0cSwgcmVudGFfbWVjYW5pc21vcykpDQoNCm1lcmdlX2Z1bmMgPC0gZnVuY3Rpb24oLi4uKSBtZXJnZSguLi4sIGFsbC54ID0gVCwgYnkgPSAiYW5pbyIpDQoNCnJlbnRhX3VzZCA9IFJlZHVjZShtZXJnZV9mdW5jLCBsaXN0KHJlbnRhX2FyZywgdGNwX2FyZywgaXBjX3VzKSkNCnJlbnRhX3VzZFssIHZhbG9yIDo9ICgodmFsb3IvMWU2KS9UQ3ApL2lwY191c18yMF0NCnJlbnRhX3VzZFssIHVuaWRhZCA6PSAiTWlsbG9uZXMgZGUgVVNEIFRDcCBkZSAyMDIwIl0NCiMgcmVudGFfdXNkID0gbWVyZ2UocmVudGFfdXNkLCB0Y3BfYXJnLCBieSA9ICJhbmlvIiwgYWxsLng9IFQpDQoNCnJlbnRhX3Bsb3QxID0gZ2dwbG90KHJlbnRhX3VzZFthbmlvID4gMTk5NV0sIGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB2YXIpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgZGUgQXJnZW50aW5hIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJDb21wYXJhY2nDs24gZGUgZXN0aW1hY2lvbmVzIHByb3BpYXMiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIFRDcCBkZSAyMDIwIikrDQogICMgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2MCoxZTQsIDEwKjFlNCkpDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNjAwMDAsIDEwMDAwKSkNCnJlbnRhX3Bsb3QxID0gcGxvdF90aGVtZShyZW50YV9wbG90MSkrdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQ0KDQpnZ3NhdmUoIGZpbGVuYW1lID0gIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL3JlbnRhX21lY2FuaXNtb3NfeV9weHFfQVJHLnBuZyIsIA0KICAgICAgICByZW50YV9wbG90MSwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTApDQpyZW50YV9wbG90MQ0KYGBgDQoNCg0KYGBge3J9DQpyZW50YV9wZXh0cV9wYmkgPSByZWFkX2V4Y2VsKCIuLi9yZXN1bHRhZG9zL2FyZ2VudGluYS9yZW50YV9kZV9sYV90aWVycmFfaGlkcm9jYXJidXJpZmVyYV9hcmcueGxzeCIsIHNoZWV0ID0gIlJUUEdfUGV4dFFfdnNfcGliIikgJT4lIA0KICBtdXRhdGUodmFyID0gIlJlbnRhIHBvciBkZXNjdWVudG9zIHNvYnJlIHBsdXN2YWzDrWEiKQ0KDQpyZW50YV9tZWNhbmlzbW9zX3BiaSA9IHJlYWRfZXhjZWwoIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL3JlbnRhX2RlX2xhX3RpZXJyYV9oaWRyb2NhcmJ1cmlmZXJhX2FyZy54bHN4Iiwgc2hlZXQgPSAiUlRQR19tZWNhbmlzbW9zX3ZzX3BpYiIpICU+JSANCiAgbXV0YXRlKHZhciA9ICJSZW50YSBwb3Igc3VtYSBkZSBtZWNhbmlzbW9zIikNCg0KcmVudGFfcGJpID0gYXMuZGF0YS50YWJsZShyYmluZChyZW50YV9wZXh0cV9wYmksIHJlbnRhX21lY2FuaXNtb3NfcGJpKSkNCnJlbnRhX3BiaSA9IHJlbnRhX3BiaVssICEidW5pZGFkIiwgd2l0aD1GXQ0KcmVudGFfcGJpID0gbWVsdChyZW50YV9wYmksIGlkLnZhcnMgPSBjKCJhbmlvIiwgInZhciIpKQ0KDQpyZW50YV9wbG90MiA9IGdncGxvdChyZW50YV9wYmksIGFlcyhhbmlvLCB2YWx1ZSwgY29sb3IgPSB2YXIpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlLCBuY29sID0xKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAyKSkrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTk2MCwgMjAyMCwgNSkpDQpyZW50YV9wbG90MiA9IHBsb3RfdGhlbWUocmVudGFfcGxvdDIpK3RoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdD0gMC43LCBoanVzdD0gMC41KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkNCnJlbnRhX3Bsb3QyDQpgYGANCg0KDQoNCg0KIyBDb21wYXJhY2nDs24gY29uIGVzdGltYWNpw7NuIGRlIG90cm9zIGF1dG9yZXMNCmBgYHtyfQ0KI2NhcmdvIHJlbnRhIGF1dG9yZXMNCnJlbnRhX2F1dG9yZXMgPC0gZnJlYWQoIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL3JlbnRhX2F1dG9yZXMuY3N2IikgDQpyZW50YV9hdXRvcmVzID0gbWVyZ2UocmVudGFfYXV0b3JlcywgaXBjX3VzLCBhbGwueD1ULCBieSA9ICJhbmlvIikNCnJlbnRhX2F1dG9yZXNbLCB2YWxvciA6PSB2YWxvciAvaXBjX3VzXzIwXQ0KcmVudGFfYXV0b3Jlc1ssIHVuaWRhZCA6PSAiTWlsbG9uZXMgZGUgVVNEIFRDYyBkZSAyMDIwIl0NCnJlbnRhX2F1dG9yZXMgPSByZW50YV9hdXRvcmVzWywhImlwY191c18yMCIsIHdpdGg9Rl0NCnJlbnRhX2F1dG9yZXMgPSBtZXJnZShyZW50YV9hdXRvcmVzLCB0Y3BfYXJnLCBhbGwueD0gVCwgYnkgPSAiYW5pbyIpDQpyZW50YV9hdXRvcmVzWyx2YWxvciA6PSAodmFsb3IqVENjKS9UQ3BdDQpyZW50YV9hdXRvcmVzPSByZW50YV9hdXRvcmVzWywgIWMoIlRDYyIsICJUQ3AiKSwgd2l0aCA9IEZdDQoNCiNwcmVwcm9jZXNvIHJlbnRhIHRvdGFsDQpyZW50YV91c2QgPSByZW50YV91c2RbLCAhYygiVENjIiwgIlRDcCIsICJpcGNfdXNfMjAiKSwgd2l0aCA9IEZdDQpzZXRuYW1lcyhyZW50YV91c2QsICJ2YXIiLCAidGlwb19kZV9yZW50YSIpDQpyZW50YV91c2RbLCBhdXRvciA6PSAiUHJvcGlhIl0NCg0KI3ByZXByb2Nlc28gcmVudGEgbWVjYW5pc21vcw0KcmVudGFfbWVjYW5pc21vc1ssIGF1dG9yIDo9ICJQcm9waWEiXQ0KcmVudGFfbWVjYW5pc21vcyA9IHJlbnRhX21lY2FuaXNtb3NbLCAhYygiVENjIiwgIlRDcCIsICJpcGNfdXNfMjAiKSwgd2l0aCA9IEZdDQpzZXRuYW1lcyhyZW50YV9tZWNhbmlzbW9zLCAidGlwb19yZW50YSIsICJ0aXBvX2RlX3JlbnRhIikNCnJlbnRhX21lY2FuaXNtb3MgPSBkY2FzdChyZW50YV9tZWNhbmlzbW9zLCBhbmlvK2F1dG9yK3VuaWRhZH50aXBvX2RlX3JlbnRhLCB2YWx1ZS52YXIgPSAidmFsb3IiKQ0KcmVudGFfbWVjYW5pc21vc1ssIGA6PWAocmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvcyA9IHJvd1N1bXMoY2JpbmQoUmRpZnBfY3J1ZG8sIFJkaWZwX2dhcyksIG5hLnJtPVQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgcmVudGFfZXN0YWRvX3RvdGFsID0gcm93U3VtcyhjYmluZChScmV0LCBScmVnKSwgbmEucm09VCksDQogICAgICAgICAgICAgICAgICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbiA9IHJvd1N1bXMoY2JpbmQoUnN2eF9jcnVkbywgUnN2eF9nYXMpLCBuYS5ybT1UKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFN1YnMgPSBTdWJzKi0xKV0NCnJlbnRhX21lY2FuaXNtb3M9IHJlbnRhX21lY2FuaXNtb3NbLCAhYygiUmRpZnBfY3J1ZG8iLCAiUmRpZnBfZ2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnN2eF9jcnVkbyIsICJSc3Z4X2dhcyIpLCB3aXRoPUZdDQpzZXRuYW1lcyhyZW50YV9tZWNhbmlzbW9zLCBjKCJSa2luZHYiLCAiU3VicyIsICJScmV0IiwgICJScmVnIiksIA0KICAgICAgICAgYygicmVudGFfZW1wcmVzYXMiLCAic3Vic2lkaW9zIiwgInJldGVuY2lvbmVzIiwgInJlZ2FsaWFzIikgKQ0KcmVudGFfbWVjYW5pc21vcyA9IG1lbHQocmVudGFfbWVjYW5pc21vcyxpZC52YXJzID0gYygiYW5pbyIsICJhdXRvciIsICJ1bmlkYWQiKSwgdmFyaWFibGUubmFtZSA9ICJ0aXBvX2RlX3JlbnRhIiwNCiAgICAgdmFsdWUubmFtZSA9ICJ2YWxvciIpDQojanVudG8gbG9zIGRhdG9zDQpyZW50YV9jb21wYXJhY2lvbiA9IHJiaW5kKHJlbnRhX3VzZCwgcmVudGFfbWVjYW5pc21vcywgcmVudGFfYXV0b3JlcykNCmBgYA0KDQoNCmBgYHtyfQ0KI2dyYWZpY28gcmVudGEgdG90YWwNCmdyYWZfcmVudGFfdG90YWxfY29tcGFyYWNpb24gPSBnZ3Bsb3QoZGF0YSA9IHJlbnRhX2NvbXBhcmFjaW9uW3N0cl9kZXRlY3QodGlwb19kZV9yZW50YSAsICJyZW50YV90b3RhbHxSZW50YSBwb3Igc3VtYSBkZSBtZWNhbmlzbW9zIikgJiBhbmlvID4gMTk5MF0sIA0KICAgICAgIGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBhdXRvcikpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgZGUgbGEgdGllcnJhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIGRlIEFyZ2VudGluYSIsDQogICAgICAgc3VidGl0bGUgPSAiQ29tcGFyYWNpw7NuIGNvbiBvdHJhcyBlc3RpbWFjaW9uZXMiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIFRDcCBkZSAyMDIwIiwgeD0iIiwNCiAgICAgICBjYXB0aW9uID0gIk5vdGE6IGVuIGxhIGVzdGltYWNpw7NuIHByb3BpYSBzZSB1dGlsaXrDsyBsYSByZW50YSBwb3IgcG9yIHN1bWEgZGUgbWVjYW5pc21vcyIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTk2MCwgMjAyMCwgNSkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkNCmdyYWZfcmVudGFfdG90YWxfY29tcGFyYWNpb24gPXBsb3RfdGhlbWUoIGdyYWZfcmVudGFfdG90YWxfY29tcGFyYWNpb24pK3RoZW1lKA0KICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQpncmFmX3JlbnRhX3RvdGFsX2NvbXBhcmFjaW9uDQoNCmdnc2F2ZSgiLi4vcmVzdWx0YWRvcy9hcmdlbnRpbmEvY29tcGFyYWNpb25fYXV0b3Jlc191c2RfdGNwLnBuZyIsIGdyYWZfcmVudGFfdG90YWxfY29tcGFyYWNpb24sDQogICAgICAgICB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KQ0KYGBgDQoNCmBgYHtyfQ0KI2dyYWZpY28gY29tcGFyYWNpb24gY29uIG90cm9zIGF1dG9yZXMNCmdyYWZfdGlwb3NfcmVudGEgPC0gZ2dwbG90KGRhdGEgPSByZW50YV9jb21wYXJhY2lvblshc3RyX2RldGVjdCh0aXBvX2RlX3JlbnRhLCBjKCJyZW50YV90b3RhbHxSZW50YSBwb3IgZGVzY3VlbnRvcyBzb2JyZSBwbHVzdmFsw61hfFJlbnRhIHBvciBzdW1hIGRlIG1lY2FuaXNtb3N8cmVudGFfZXN0YWRvX3RvdGFsIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAicmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkmIGFuaW8gPjE5OTBdLA0KICAgICAgIGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBhdXRvcikpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludChzaXplID0gMC41KSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkrDQogIGZhY2V0X3dyYXAofnRpcG9fZGVfcmVudGEsIHNjYWxlcyA9ICJmcmVlX3kiKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBkZSBsYSB0aWVycmEgaGlkcm9jYXJidXLDrWZlcmEiLA0KICAgICAgIHN1YnRpdGxlID0gIkNvbXBhcmFjacOzbiBkZSBlc3RpbWFjaW9uZXMiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgVVNEIFRDcCBkZSAyMDIwIikrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTk5MCwgMjAyMCwgNSkpDQojICMgIyBnZ3Bsb3RseShncmFmX3RpcG9zX3JlbnRhLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KZ3JhZl90aXBvc19yZW50YSA9IHBsb3RfdGhlbWUoZ3JhZl90aXBvc19yZW50YSkrdGhlbWUoDQogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoMTIpLCBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkgKQ0KDQpncmFmX3RpcG9zX3JlbnRhDQpnZ3NhdmUoIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL2NvbXBhcmFjaW9uX2F1dG9yZXNfdGlwb19yZW50YV91c2RfdGNwLnBuZyIsDQogICAgICAgZ3JhZl90aXBvc19yZW50YSwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gMTApDQpgYGANCg0K